package com.xr.service;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author Arnold Yand
 * @summary 基础service操作定义
 * @time 2018/4/13 16:04
 */
public interface IBaseService<T> {
  /**
   * <p>
   * 插入一条记录（选择字段，策略插入）
   * </p>
   *
   * @param entity 实体对象
   * @return T
   */
  T insert(T entity);

  /**
   * <p>
   * 插入（批量），该方法不适合 Oracle
   * </p>
   *
   * @param entityList 实体对象列表
   * @return Integer
   */
  Integer insertBatch(List<T> entityList);

  /**
   * <p>
   * 插入（批量）
   * </p>
   *
   * @param entityList 实体对象列表
   * @param batchSize  插入批次数量
   * @return Integer
   */
  Integer insertBatch(List<T> entityList, int batchSize);

  /**
   * <p>
   * 批量修改插入
   * </p>
   *
   * @param entityList 实体对象列表
   * @return Integer
   */
  Integer insertOrUpdateBatch(List<T> entityList);

  /**
   * <p>
   * 批量修改插入
   * </p>
   *
   * @param entityList 实体对象列表
   * @param batchSize
   * @return Integer
   */
  Integer insertOrUpdateBatch(List<T> entityList, int batchSize);

  /**
   * <p>
   * 根据 ID 删除
   * </p>
   *
   * @param id 主键ID
   * @return Integer
   */
  Integer deleteById(Serializable id);

  /**
   * <p>
   * 根据 columnMap 条件，删除记录
   * </p>
   *
   * @param columnMap 表字段 map 对象
   * @return Integer
   */
  Integer deleteByMap(Map<String, Object> columnMap);

  /**
   * <p>
   * 根据 entity 条件，删除记录
   * </p>
   *
   * @param wrapper 实体包装类 {@link Wrapper}
   * @return Integer
   */
  Integer delete(Wrapper<T> wrapper);

  /**
   * <p>
   * 删除（根据ID 批量删除）
   * </p>
   *
   * @param idList 主键ID列表
   * @return Integer
   */
  Integer deleteBatchIds(Collection<? extends Serializable> idList);

  /**
   * <p>
   * 根据 ID 选择修改
   * </p>
   *
   * @param entity 实体对象
   * @return T
   */
  Integer updateById(T entity);

  /**
   * <p>
   * 根据 whereEntity 条件，更新记录
   * </p>
   *
   * @param entity  实体对象
   * @param wrapper 实体包装类 {@link Wrapper}
   * @return T
   */
  T update(T entity, Wrapper<T> wrapper);

  /**
   * <p>
   * 根据ID 批量更新
   * </p>
   *
   * @param entityList 实体对象列表
   * @return Integer
   */
  Integer updateBatchById(List<T> entityList);

  /**
   * <p>
   * 根据ID 批量更新
   * </p>
   *
   * @param entityList 实体对象列表
   * @param batchSize  更新批次数量
   * @return Integer
   */
  Integer updateBatchById(List<T> entityList, int batchSize);

  /**
   * <p>
   * TableId 注解存在更新记录，否插入一条记录
   * </p>
   *
   * @param entity 实体对象
   * @return T
   */
  T insertOrUpdate(T entity);

  /**
   * <p>
   * 根据 ID 查询
   * </p>
   *
   * @param id 主键ID
   * @return T
   */
  T selectById(Serializable id);

  /**
   * <p>
   * 查询（根据ID 批量查询）
   * </p>
   *
   * @param idList 主键ID列表
   * @return List<T>
   */
  List<T> selectBatchIds(Collection<? extends Serializable> idList);

  /**
   * <p>
   * 查询（根据 columnMap 条件）
   * </p>
   *
   * @param columnMap 表字段 map 对象
   * @return List<T>
   */
  List<T> selectByMap(Map<String, Object> columnMap);

  /**
   * <p>
   * 根据 Wrapper，查询一条记录
   * </p>
   *
   * @param wrapper 实体对象
   * @return T
   */
  T selectOne(Wrapper<T> wrapper);

  /**
   * <p>
   * 根据 Wrapper，查询一条记录
   * </p>
   *
   * @param wrapper {@link Wrapper}
   * @return Map<String,Object>
   */
  Map<String, Object> selectMap(Wrapper<T> wrapper);

  /**
   * <p>
   * 根据 Wrapper，查询一条记录
   * </p>
   *
   * @param wrapper {@link Wrapper}
   * @return Object
   */
  Object selectObj(Wrapper<T> wrapper);

  /**
   * <p>
   * 根据 Wrapper 条件，查询总记录数
   * </p>
   *
   * @param wrapper 实体对象
   * @return int
   */
  int selectCount(Wrapper<T> wrapper);

  /**
   * <p>
   * 查询列表
   * </p>
   *
   * @param wrapper 实体包装类 {@link Wrapper}
   * @return
   */
  List<T> selectList(Wrapper<T> wrapper);

  /**
   * <p>
   * 翻页查询
   * </p>
   *
   * @param page 翻页对象
   * @return
   */
  Page<T> selectPage(Page<T> page);

  /**
   * <p>
   * 查询列表
   * </p>
   *
   * @param wrapper {@link Wrapper}
   * @return
   */
  List<Map<String, Object>> selectMaps(Wrapper<T> wrapper);

  /**
   * <p>
   * 根据 Wrapper 条件，查询全部记录
   * </p>
   *
   * @param wrapper 实体对象封装操作类（可以为 null）
   * @return List<Object>
   */
  List<Object> selectObjs(Wrapper<T> wrapper);

  /**
   * <p>
   * 翻页查询
   * </p>
   *
   * @param page    翻页对象
   * @param wrapper {@link Wrapper}
   * @return
   */
  @SuppressWarnings("rawtypes")
  Page<Map<String, Object>> selectMapsPage(Page page, Wrapper<T> wrapper);

  /**
   * <p>
   * 翻页查询
   * </p>
   *
   * @param page    翻页对象
   * @param wrapper 实体包装类 {@link Wrapper}
   * @return
   */
  Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);
}
